package ejemplo.componentes;

import ejemplo.componentes.interfaces.IMovil;
import ejemplo.util.Vector2D;
import es.componentes.Componente;
import es.entidades.Entidad;

/**
 * Componente que se encarga del movimiento.
 * @author Miguel Vicente
 */
public class ComponenteMovimiento2 extends Componente implements IMovil {
	
	private boolean bloqueado;
	private double vMax;
	private double moduloAceleracion;
	private Vector2D velocidad;
	private Vector2D aceleracion;
	private ComponentePosicion2D posicion;
	
	/**
	 * Constructor.
	 * @param pos Posicion de la entidad a la que pertenece este componente.
	 * @param entidad Entidad a la que pertenece este componente.
	 */
	public ComponenteMovimiento2(ComponentePosicion2D pos, Entidad entidad) {
		super(entidad);
		this.bloqueado = false;
		this.vMax = 500;
		this.moduloAceleracion = 1000;
		this.velocidad = new Vector2D();
		this.aceleracion = new Vector2D(0, moduloAceleracion);
		this.posicion = pos;
	}
	/**
	 * Constructor.
	 * @param vMax Velocidad maxima en valor absoluto
	 * @param v Velocidad
	 * @param modA Modulo de la aceleracion
	 * @param a Aceleracion
	 * @param pos Posicion de la entidad a la que pertenece este componente.
	 * @param entidad Entidad a la que pertenece este componente.
	 */
	public ComponenteMovimiento2(double vMax, Vector2D v, double modA, Vector2D a, ComponentePosicion2D pos, Entidad entidad) {
		super(entidad);
		this.bloqueado = false;
		this.vMax = vMax;
		this.velocidad = v;
		this.moduloAceleracion = modA;
		this.aceleracion = a;
		this.posicion = pos;
	}
	
	@Override
	public String getTipo() {
		return IMovil.ID_INTERFAZ;
	}
	
	@Override
	public void moverX(double delta) {
		if (!bloqueado) {
			posicion.setX(calcularNuevaPosX(delta));
		}
	}

	@Override
	public void moverY(double delta) {
		if (!bloqueado) {
			posicion.setY(calcularNuevaPosY(delta));
		}
	}

	@Override
	public double calcularNuevaPosX(double delta) {
		double v;
		if (!bloqueado) {
			v = (aceleracion.getX() * delta + velocidad.getX());
			if (v < -vMax) v = -vMax;
			if (v >  vMax) v =  vMax;
			return (0.5 * aceleracion.getX() * delta * delta + v * delta + posicion.getX());
		}
		return posicion.getX();
	}

	@Override
	public double calcularNuevaPosY(double delta) {
		double v;
		if (!bloqueado) {
			v = (aceleracion.getY() * delta + velocidad.getY());
			if (v < -vMax) v = -vMax;
			if (v >  vMax) v =  vMax;
			return (0.5 * aceleracion.getY() * delta * delta + v * delta + posicion.getY());
		}
		return posicion.getY();
	}
	
	@Override
	public void bloquear() {
		this.bloqueado = true;		
	}
	@Override
	public void desbloquear() {
		this.bloqueado = false;
	}
	@Override
	public boolean isBloqueado() {
		return bloqueado;
	}
	
	public double getvMax() {
		return vMax;
	}
	
	public void setvMax(double vMax) {
		this.vMax = vMax;
	}
	
	public double getModuloAceleracion() {
		return moduloAceleracion;
	}
	
	public void setModuloAceleracion(double moduloAceleracion) {
		this.moduloAceleracion = moduloAceleracion;
	}
	
	public Vector2D getVelocidad() {
		return velocidad;
	}
	
	public void setVelocidad(Vector2D velocidad) {
		this.velocidad = velocidad;
	}
	
	public Vector2D getAceleracion() {
		return aceleracion;
	}
	
	public void setAceleracion(Vector2D aceleracion) {
		this.aceleracion = aceleracion;
	}
	
	public ComponentePosicion2D getPosicion() {
		return posicion;
	}
	
	public void setPosicion(ComponentePosicion2D posicion) {
		this.posicion = posicion;
	}
	@Override
	public double calcularNuevaVelX(double delta) {
		// TODO Auto-generated method stub
		return 0;
	}
	@Override
	public double calcularNuevaVelY(double delta) {
		// TODO Auto-generated method stub
		return 0;
	}
	@Override
	public void mover(double delta) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public Vector2D calcularNuevaPos(double delta) {
		// TODO Auto-generated method stub
		return null;
	}
	@Override
	public Vector2D calcularNuevaVel(double delta) {
		// TODO Auto-generated method stub
		return null;
	}

}
